#include "Moto.h"
#include "../lib/basicas.h"

void mover_moto(int x_actual, int y_actual, int ultimo_mov, int id_moto) {

	int random_movimiento = 0;
	int r_mov;
	int i = 0;
	int movio = 0;
	int posicion_vector_moto = id_moto - 1;

	int LOCAL_ARRIBA = 1, LOCAL_ABAJO = 1, LOCAL_IZQ = 1, LOCAL_DER = 1;
	int espera_proximo_movimiento = 1;
	/* printf(" X:%d Y:%d ID:%d | %d %d \n", x_actual, y_actual, id_moto, tabla_thr[posicion_vector_moto].posX, tabla_thr[posicion_vector_moto].posY); */

	/*-- Limpio pantalla --*/
	system("clear");

	while (espera_proximo_movimiento) {

		/*-- Genero Random --*/
		srand((unsigned) time(0));
		random_movimiento = (rand() % 4) + 1;

		switch (random_movimiento) {
			case ARRIBA:
				if (LOCAL_ARRIBA == 1 && (x_actual > 0 && coordenadasLibres(
						x_actual - 1, y_actual, id_moto, TRUE) == TRUE)) {
					actualizar_matriz(x_actual - 1, y_actual, id_moto);
					tabla_thr[posicion_vector_moto].posX = x_actual - 1;
					tabla_thr[posicion_vector_moto].posY = y_actual;
					sprintf(logMessageAux, "ARRIBA: Moto %d (%d,%d)->(%d,%d)",
							id_moto, x_actual, y_actual, x_actual - 1, y_actual);
					//setLog(logMessageAux, INFO, NOMBREPROCESO);
					sleep(TIME_SLEEP);
					espera_proximo_movimiento = 0;
				} else {
					LOCAL_ARRIBA = 0;
				}
				break;

			case ABAJO:
				if (LOCAL_ABAJO == 1 && (x_actual < ALTO_MAPA - 1
						&& coordenadasLibres(x_actual + 1, y_actual, id_moto, TRUE)
								== TRUE)) {
					actualizar_matriz(x_actual + 1, y_actual, id_moto);
					tabla_thr[posicion_vector_moto].posX = x_actual + 1;
					tabla_thr[posicion_vector_moto].posY = y_actual;
					sprintf(logMessageAux, "ABAJO: Moto %d (%d,%d)->(%d,%d)",
							id_moto, x_actual, y_actual, x_actual + 1, y_actual);
					//setLog(logMessageAux, INFO, NOMBREPROCESO);
					sleep(TIME_SLEEP);
					espera_proximo_movimiento = 0;
				} else {
					/* printf("LOCAL_ABAJO = %d\n", LOCAL_ABAJO); */
					LOCAL_ABAJO = 0;
				}
				break;

			case IZQUIERDA:
				if (LOCAL_IZQ == 1 && (y_actual > 0 && coordenadasLibres(x_actual,
						y_actual - 1, id_moto, TRUE) == TRUE)) {
					actualizar_matriz(x_actual, y_actual - 1, id_moto);
					tabla_thr[posicion_vector_moto].posX = x_actual;
					tabla_thr[posicion_vector_moto].posY = y_actual - 1;
					sprintf(logMessageAux, "IZQUIERDA: Moto %d (%d,%d)->(%d,%d)",
							id_moto, x_actual, y_actual, x_actual, y_actual - 1);
					//setLog(logMessageAux, INFO, NOMBREPROCESO);
					espera_proximo_movimiento = 0;
					sleep(TIME_SLEEP);
				} else {
					LOCAL_IZQ = 0;
				}

				break;

			case DERECHA:
				if (LOCAL_DER == 1 && (y_actual < ANCHO_MAPA - 1
						&& coordenadasLibres(x_actual, y_actual + 1, id_moto, TRUE)
								== TRUE)) {
					actualizar_matriz(x_actual, y_actual + 1, id_moto);
					tabla_thr[posicion_vector_moto].posX = x_actual;
					tabla_thr[posicion_vector_moto].posY = y_actual + 1;
					sprintf(logMessageAux, "DERECHA: Moto %d (%d,%d)->(%d,%d)",
							id_moto, x_actual, y_actual, x_actual, y_actual + 1);
					//setLog(logMessageAux, INFO, NOMBREPROCESO);
					espera_proximo_movimiento = 0;
					sleep(TIME_SLEEP);
				} else {

					LOCAL_DER = 0;
				}
				break;
		}


		/*-- Sino pudo moverse hacia ningun lado, mato la moto --*/
		if (LOCAL_ABAJO == 0 && LOCAL_ARRIBA == 0 && LOCAL_DER == 0
				&& LOCAL_IZQ == 0) {

			int x, y;

			espera_proximo_movimiento = 0;

			limpiar_rastros_moto(id_moto);

			sprintf(logMessageAux, "Reinicio Moto %d", id_moto);
			//setLog(logMessageAux, INFO, NOMBREPROCESO);

			do {
				srand((unsigned) time(0) + 3);
				x = rand() % ALTO_MAPA;

				srand((unsigned) time(0) + 7);
				y = rand() % ANCHO_MAPA;

			} while (coordenadasLibres(x, y, id_moto, TRUE) == 0);

			tabla_thr[posicion_vector_moto].posX = x;
			tabla_thr[posicion_vector_moto].posY = y;
			actualizar_matriz(tabla_thr[posicion_vector_moto].posX,
					tabla_thr[posicion_vector_moto].posY,
					tabla_thr[posicion_vector_moto].id);
			sprintf(logMessageAux,
					"Inicializo Moto %d en vector: posicion (%d,%d)", id_moto,
					tabla_thr[posicion_vector_moto].posX,
					tabla_thr[posicion_vector_moto].posY);
			//setLog(logMessageAux, INFO, NOMBREPROCESO);
		}
	}

}
